

#include "main.h"
#include "lcd.h"
#include "sc-s.h"
#include "utils.h"
#include "trans-s.h"
#include <stdlib.h>

#define HR_ZPB	15		// 1.5%
#define HR_ZNB	25		//-2.5%

#define LR_ZPB	9		// 0.09%
#define LR_ZNB	20		//-2.00%

u16 meas = 0;


#define DEFAULT_AWP_DELAY	45

#ifndef MEDIA_O2
void awp_check()
{
	static u8 delay1 = 0;
	static u8 delay2 = 0;
	
#ifdef MEDIA_CH4IR
	if (meas == CODE_INIT)
	{
		ALARM1_OFF;
		ALARM2_OFF;
		return;
	}
	
#endif
	
	
	if (!Awp)
	{
		if (awp_flags & POWERFLAG)
		{
			ALARM1_OFF;
			ALARM2_OFF;
			return;
		}
		
		if (awp_flags & AL1_FLAG)
		{
			ALARM1_OFF;
		}
		else
		{
			ALARM1_ON;
		}
		
		if (awp_flags & AL2_FLAG)
		{
			ALARM2_OFF;
		}
		else
		{
			ALARM2_ON;
		}
		
		
		return;
	}
	
	if (meas & 0x8000)
	{
		ALARM1_OFF;
		ALARM2_OFF;
		return;
	}
	
	u8 ok1 = 1;
	u8 ok2 = 1;
	
	if (meas & 0x4000)	// low level
	{
		if (meas & 0x1000)	//minus
		{
			if ((meas & 0x0FFF) > 20)		 //< -0.2%
			{
				ALARM1_OFF;
				ALARM2_OFF;
				return;
			}
		}
		if ((meas & 0x0FFF) > AL1)
		{
			ok1 = 0;
			delay1 = DEFAULT_AWP_DELAY;
		}
		else
		{
			if (delay1)
			{
				delay1 --;
				ok1 = 0;
			}
			if (delay2)
			{
				delay2 --;
				ok2 = 0;
			}
		}
		if ((meas & 0x0FFF) > AL2)
		{
			ok2 = 0;
			ok1 = 0;
			delay2 = DEFAULT_AWP_DELAY;
			delay1 = DEFAULT_AWP_DELAY;
		}
		else
		{
			if (delay2 && ((meas & 0x0FFF) > AL1))
			{
				delay2 --;
				ok2 = 0;
			}
		}
		
		if (awp_flags & POWERFLAG)
		{
			ok1 = 0;
			ok2 = 0;
		}
		
		if (ok1 && (!(awp_flags & AL1_FLAG)))
		{
			ALARM1_ON;
		}
		else
		{
			ALARM1_OFF;
		}
		
		if (ok2 && (!(awp_flags & AL2_FLAG)))
		{
			ALARM2_ON;
		}
		else
		{
			ALARM2_OFF;
		}
	}
	
}

#endif

#ifdef MEDIA_CH4
void show_high(u16 value, u8 flags)
{
	char str[10];
	if (! ( value & 0x2000))	// 13 = 0, positiv
	{
		if (value < HR_ZPB && (!(flags & 0x80) ) )	// show spec bit 8
		value = 0;
		value &= 0x0FFF;
		fuse1(str,value);
		if (value < 1000)
		{
			if (value < 99)		// 9.9%
			{
				lcd_print(" ");
			}
			lcd_print(str);
			lcd_print("%CH4");
			return;
		}
		else
		{
			if (flags & 0x80 || !MIN )	// show spec
			{
				value &= 0x0FFF;
				fuse1(str,value);
				lcd_print("  ");
				lcd_print(str);
				lcd_print("%");
			}
			else
			{
				lcd_print(" >100% !");
			}
			return;
		}
	}
	// negativ
	value &= 0x0FFF;		// clear bit 13
	
	if (value < HR_ZNB && (!(flags & 0x80) ) )	// show spec bit 8
	value = 0;
	if (value > 0)
	{
		fuse1(str,value);
		lcd_print(" -");
		lcd_print(str);
		lcd_print("%  ");
	}
	else
	{
		lcd_print(" 0.0%CH4");
	}
	return;
	
	
}

#elif MEDIA_CH4IR

void show_high(u16 value, u8 flags)
{
	char str[10];

	u8 s_flag = 0;
	if (value & (1 << 13))
		s_flag = 1;

	if (value < HR_ZPB && (!(flags & 0x80) ) )	// show spec bit 8
	value = 0;
	value &= 0x0FFF;
	fuse1(str,value);
	if (value < 1000)
	{
		if (value < 99)		// 9.9%
		{
			lcd_print(" ");
		}
		if (s_flag)
			for (u8 c = 0; c < strlen(str); c++)
				if (str[c] == '.')
					str[c] = ',';
		
		lcd_print(str);
		lcd_print("%CH4");
		return;
	}
	else
	{
		if (flags & 0x80 || !MIN )	// show spec
		{
			value &= 0x0FFF;
			fuse1(str,value);
			lcd_print("  ");
			lcd_print(str);
			lcd_print("%");
		}
		else
		{
			lcd_print(" >100% !");
		}
		return;
	}
}

#endif

#ifdef MEDIA_CH4

void show_low(u16 value, u8 flags)
{
	char str[10];
	if (! ( value & 0x1000))	// 12 = 0, positiv
	{
		if (value < LR_ZPB && (!(flags & 0x80) ) )	// show spec bit 8
		value = 0;
		
		value &= 0x0FFF;
		fuse2(str,value);

		lcd_print(str);
		lcd_print("%CH4");
		return;
	}
	// negativ
	value &= 0x0FFF;		// clear bit 12
	
	if (value < LR_ZNB && (!(flags & 0x80) ) )	// show spec bit 8
	value = 0;
	if (value > 0)
	{
		fuse2(str,value );
		lcd_print(" -");
		lcd_print(str);
		lcd_print("% ");
	}
	else
	{
		lcd_print("0.00%CH4");
	}
	return;
	
}

#elif defined(MEDIA_CH4IR)


void show_low(u16 value, u8 flags)
{
	char str[10];

	u8 s_flag = (value & (1 << 12)) >> 12;

	if (value < LR_ZPB && (!(flags & 0x80) ) )	// show spec bit 8
	value = 0;
	
	value &= 0x0FFF;
	fuse2(str,value);
	
	if (s_flag)
	{
		for (u8 c = 0; c < strlen(str); c++)
			if (str[c] == '.')
				str[c] = ',';
	}


	lcd_print(str);
	lcd_print("%CH4");
	return;
	
}

#elif defined(MEDIA_CO2)
void show_low(u16 value, u8 flags)
{
	char str[10];
	if (! ( value & 0x1000))	// 12 = 0, positiv
	{
		if (value < LR_ZPB && (!(flags & 0x80) ) )	// show spec bit 8
		value = 0;
		
		value &= 0x0FFF;
		fuse2(str,value);

		lcd_print(str);
		lcd_print("%CO2");
		return;
	}
	// negativ
	value &= 0x0FFF;		// clear bit 12
	
	if (value < LR_ZNB && (!(flags & 0x80) ) )	// show spec bit 8
	value = 0;
	if (value > 0)
	{
		fuse2(str,value );
		lcd_print(" -");
		lcd_print(str);
		lcd_print("% ");
	}
	else
	{
		lcd_print("0.00%CO2");
	}
	return;
	
}
#endif

void show_med_low(u16 value)
{
	char str[10];
	if (! ( value & 0x1000))	// 12 = 0, positiv
	{
		value &= 0x0FFF;
		fuse2(str,value);

		lcd_print(str);
		return;
	}
	// negativ
	value &= 0x0FFF;		// clear bit 12
	
	
	if (value > 0)
	{
		fuse1(str,value / 10) ;
		lcd_print("-");
		lcd_print(str);
	}
	else
	{
		lcd_print("0.00");
	}
	return;
	
}


void show_med_high(u16 value)
{
	char str[10];
	if (! ( value & 0x2000))	// 13 = 0, positiv
	{
		fuse1(str,value);
		lcd_print(str);
		lcd_print("%CH4");
		return;
	}
	// negativ
	value &= 0x0FFF;		// clear bit 13
	
	fuse1(str,value);
	lcd_print("-");
	lcd_print(str);
	return;
	
	
}


void show_media(u16 value, u8 flags)
{
	lcd_home();
	
/*
	if (debug_data)
	{
		lcd_print("D:");
		char str[10];
		itoa(debug_data,str,10);
		lcd_print(str);
		lcd_print("  ");
		WAITMS(250);
		debug_data = 0;
		return;
	}
	*/
	if ((value & 0xFF00) == 0xFF00)
	{
		lcd_home();
		switch(value)
		{
			case CODE_ERR:
			lcd_print("!ERROR! ");
			break;
			case CODE_INIT:
			lcd_def(2,0b01110,0b10101,0b10101,0b10111,0b10001,0b10001,0b01110,0b00000);
			lcd_def(3,0b01110,0b10101,0b10101,0b10101,0b10101,0b10101,0b01110,0b00000);
			lcd_def(4,0b01110,0b10101,0b10101,0b11101,0b10001,0b10001,0b01110,0b00000);
			lcd_def(5,0b01110,0b10101,0b10101,0b10101,0b10001,0b10001,0b01110,0b00000);
			lcd_home();
			static u8 clock = 2;
			clock ++;
			if (clock > 5)
			clock = 2;
			WAITMS(250);
			lcd_print("Init ");
			lcd_sign(clock);
			lcd_print("  ");
			break;
			case CODE_ZERO:
			lcd_print("Zero....");
			break;
			case CODE_SENS:
			lcd_print("Czulosc.");
			break;
			case CODE_FACT:
			lcd_print("Fabryczn");
			break;
		}
		
		return;
	}
	
#ifndef MEDIA_CO2
	if (value & 0x8000)	// high range
	{
		value &= 0x7FFF;	//15
		show_high(value,flags);
	}
#endif
	if (value & 0x4000)
	{
		value &= 0xBFFF;	// 14
		show_low(value,flags);
	}
}
